/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.marlboroug.articles;

import com.marlboroug.entity.Articles;
import com.marlboroug.entity.Articlesbyauthors;
import com.marlboroug.entity.Authors;
import com.marlboroug.entity.Categories;
import com.marlboroug.entity.Editors;
import com.marlboroug.entity.Parameters;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.ejb.Stateless;
import javax.persistence.Query;

@Stateless
public class ArticlesManager implements ArticlesManagerRemote {
   
    @PersistenceContext(unitName = "Marlboroug-ejbPU")
    EntityManager em;

    /** Permet de créer un Article
     * 
     * @param article Envoie un objet de type Articles
     * @return Un boolean pour confirmer la création
     */
    @Override
    public boolean create (Articles article) {  
        Boolean resultat = true;
        List<Articles> temp = findCreateArticle(article.getName());
        for (Articles n : temp) {
            resultat = false;
        } 
        if(resultat){
            em.persist(article);
            return true;
        }else {
            return false;
        }
    }

    /** Permet de renvoyer un objet Articles en fonction d'un ID
     * 
     * @param ID_articles Un ID
     * @return Un objet de type Articles
     */
    @Override
    public Articles find (Long ID_articles) {
        Articles article = em.find(Articles.class, ID_articles);
        return article;
    }

    /** Permet de mettre à jour un Article
     * 
     * @param article Un objet Articles
     * @return Un boolean pour confirmer la création
     */
    @Override
    public boolean update (Articles article) {
        Articles temp = find(article.getIDarticles());
        if(temp != null){
            em.merge(article);
            return true;
        }else {
            return false;
        }
    }

   /** Permet de renvoyer une liste des 10 articles les plus vendus
    * 
    * @return Une liste d'articles
    */
    @Override
    public List<Articles> findArticlesIndex () {
        String q = "SELECT m FROM Articles m ORDER BY m.sold DESC"; //"SELECT * FROM articles ORDER BY articles.sold  DESC LIMIT 10"
        TypedQuery<Articles> query = em.createQuery(q, Articles.class);
        query.setMaxResults(10);
        List<Articles> article = query.getResultList();
        return article;
    }
    
  /** Permet de retourner un objet Editors en fonction d'un ID
   * 
   * @param ID_editors Un id
   * @return Un objet Editors
   */
    @Override
    public Editors findEditors (Long ID_editors) {
        Editors editor = em.find(Editors.class, ID_editors);
        return editor;
    }
    
    /** Permet de retourner une liste d'articles en fonction d'une categorie
     * 
     * @param nbr Nombre de résultats
     * @param ID_categories Un ID d'une categorie
     * @return Une liste d'articles
     */
    @Override
    public List<Articles> ArticlesFindCategory (int nbr, Long ID_categories) {
        String q = "SELECT a FROM Articles a WHERE a.idCategories.iDcategories = :id"; //SELECT * FROM Articles INNER JOIN Categories WHERE Categories.ID_categories = Articles.ID_categories AND Categories.ID_categories = 9
        TypedQuery<Articles> query = em.createQuery(q, Articles.class);  
        query.setMaxResults(nbr);
        query.setParameter("id", ID_categories);
        List<Articles> article = query.getResultList();
        return article;
    }
    
    /** Permet de retourner une liste d'articles en fonction d'un editeur
     * 
     * @param nbr Nombre de résultats
     * @param ID_editors Un ID d'un editeur
     * @return Une liste d'articles
     */
    @Override
    public List<Articles> ArticlesFindEditor (int nbr, Long ID_editors) {
        String q = "SELECT a FROM Articles a INNER JOIN Editors c WHERE :object = a.idEditors AND c.iDeditors = :id"; //SELECT * FROM Articles INNER JOIN Categories WHERE Categories.ID_categories = Articles.ID_categories AND Categories.ID_categories = 9
        TypedQuery<Articles> query = em.createQuery(q, Articles.class);  
        query.setMaxResults(nbr);
        query.setParameter("object", findEditors(Long.valueOf(ID_editors)));
        query.setParameter("id", ID_editors);
        List<Articles> article = query.getResultList();
        return article;
    }
    
    /** Permet de retourner le paramétre
     * 
     * @return Le paramétre
     */
    @Override
    public List<Parameters> FindParameters () { 
        String q = "SELECT m FROM Parameters m"; //select `Parameters`.article_page from `Parameters`
        TypedQuery<Parameters> query = em.createQuery(q, Parameters.class);
        List<Parameters> parameter = query.getResultList();
        return parameter;
    }
    
    /** Permet de retourner une liste d'articles en fonction d'un nom
     * 
     * @param pattern Envoie le nom à rechercher
     * @return Une liste d'articles
     */
    @Override
    public List<Articles> retrieveByName (String pattern) {       
    String q = "SELECT m FROM Articles m WHERE m.name LIKE :pattern";
    TypedQuery<Articles> query = em.createQuery(q, Articles.class);
    query.setParameter("pattern", pattern);
    List<Articles> article = query.getResultList();
    return article;
    }
    
    /** Permet de retourner une liste d'articles en fonction d'un nom
     * 
     * @param pattern Envoie le nom à rechercher
     * @return Une liste d'articles
     */
    @Override
    public List<Articles> findCreateArticle (String pattern) {       
    String q = "SELECT m FROM Articles m WHERE m.name LIKE :pattern";
    TypedQuery<Articles> query = em.createQuery(q, Articles.class);
    query.setParameter("pattern", pattern);
    List<Articles> article = query.getResultList();
    return article;
    }
    
    /** Permet de renvoyer une liste de l'ensemble des articles
     * 
     * @return Une liste d'articles
     */
    @Override
    public List<Articles> findAll () {       
    String q = "SELECT m FROM Articles m";
    TypedQuery<Articles> query = em.createQuery(q, Articles.class);
    List<Articles> article = query.getResultList();
    return article;
    }

}
